/**
 * @file STL_Thread.hpp
 * @author Derek Liu (yjkhtddx@sina.com)
 * @brief 
 * @version 0.0.1
 * @date 2020-07-16
 * 
 * @coryright Copyright Sci-Tech Laboratories (c) 2020
 * 
 */

#pragma once
#include <pthread.h>
#include <functional>

namespace STL
{

    typedef std::function<void(void *)> thread_proc_t;

    class ThreadImpl;

    class Thread
    {
    public:
        Thread(const std::string &name, uint32_t stacksize = 2 * 1024 * 1024);
        ~Thread();

        /**
         * @brief 开启线程
         * 
         * @param proc 线程执行体
         * @param user_data 用户数据
         * @return int 0:成功 <0失败
         */
        int start(const thread_proc_t &proc, const void *user_data = nullptr);

        /**
         * @brief 停止线程
         * 
         * @return int 0成功 <0失败
         */
        int stop();

        /**
         * @brief 分离线程
         * 
         * @return int 
         */
        int detach();

        /**
         * @brief 获取线程是否运行
         * 
         * @return true 
         * @return false 
         */
        bool looping();

        int getThreadId();
        std::string getThreadName();

    private:
        ThreadImpl *m_impl;
    };

} // namespace STL
